package main

import (
	"fmt"
	"time"
)


/*
要求统计 1-200000 的数字中，哪些是素数？
这个问题在本章开篇就提出了，现在我们有 goroutine和 channel 的知识后，
就可以完成了 [测试数据: 80000]
*/

func putNum(intChan chan int){
	for i:=1;i<=80000;i++{
		intChan<-i
	}

	close(intChan)
}

func primeNum(intChan chan int,primeChan chan int , exitChan chan bool)  {

	var flag bool 
	for{
		num,ok :=<-intChan
		flag = true
		if !ok {
			break // intChan 取不到
		}

		for i:=2;i<num;i++{
			if num %i==0 {
				flag = false
				break
			}
		}
		if  flag {
			primeChan <- num
		}
	}	
	exitChan <- true
}

func main() {
	intChan := make(chan int, 100000)
	primeChan := make(chan int,200000) // 放入结果
	// 标识退出的管道
	exitChan :=make(chan bool, 4)

	start := time.Now().Unix()
	go putNum(intChan)

	for i:=0;i<4;i++{
		go primeNum(intChan,primeChan,exitChan)
	}

	

	go func(){
		for i:=0;i<4;i++{
			// 取出了四个结果以后 就可以关闭
			<-exitChan
		}

		end := time.Now().Unix()
		fmt.Println("协程耗时=",end-start)

		close(primeChan)
		close(exitChan)
		
		
	}()

	for {
		_,ok:=<-primeChan
			if !ok {
				break
			}
			// fmt.Println("素数=",res)
		
	}

	fmt.Println("exit...")


	


}